/*
token设置
使用基于token的身份验证方法，所以后端不需要存储用户登录的状态，大概的流程：
1.客户端使用用户名和密码登录
2.服务器收到请求，验证用户名和密码
3.验证成功，服务器会生成一个token，把token发送给客户端
4.客户端收到token之后，将其存储起来，比如说存储在localStorage或者sessionStorage中
5.客户端向服务端发送请求的时候，都要携带token
6.服务端收到请求，去验证客户端携带的token，如果验证成功，就返回客户端所需要的数据
 */
//jsonwebtoken：生成和验证token
const jwt = require('jsonwebtoken')

let jwtscrect = 'bookshop_token'  //加密字符串（签名）

//生成token(存储id和username)
//expiresIn ：token有效时间
exports.setToken = (id, username, role = 'user') => {
    console.log('生成token，参数:', { id, username, role });
    try {
        // 对于管理员，使用id字段，对于普通用户使用u_id字段
        const payload = role === 'admin' ? 
            { id, username, role } : 
            { u_id: id, username, role };
        
        console.log('Token payload:', payload);
        
        const token = jwt.sign(payload, jwtscrect, {
            expiresIn:'1h'
        });
        
        return token;
    } catch (err) {
        console.error('生成token失败:' + err.message);
        return null;
    }
}

//验证token
exports.getToken=(token)=>{
    return new Promise((resolve,reject)=>{
        if(!token){
            console.log('token为空');
            return reject({error:'token为空'})
        }
        //提取token
        let tokenvalue=token.split(' ')[1]  
        if(!tokenvalue){
            console.log('token格式错误');
            return reject({error:'token格式错误'})
        }
        jwt.verify(tokenvalue,jwtscrect,(err,info)=>{
            if(err){
                console.error('token验证失败:', err);
                return reject({error:'token过期或者验证失败'})
            }
            console.log('token验证成功, 解析信息:', info);
            resolve(info)  //返回解析后的值
        })
    })
}